using System.Reflection;
using BaseData.Infrastructrue.Inplements;
using BaseData.ReadApi;
using Medical.Infrastructrue;
using Medical.Infrastructrue.Interfaces;
using Medical.ReadApi.MyFilter;
using Microsoft.EntityFrameworkCore;
using NLog.Web;
using StackExchange.Redis;
using Yitter.IdGenerator;

var builder = WebApplication.CreateBuilder(args);

// 注册 MVC 控制器
builder.Services.AddControllers();
// 启用 Swagger/OpenAPI
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(o =>
{
    // 关联 XML 文档用于展示注释
    o.IncludeXmlComments(AppContext.BaseDirectory + "Medical.ReadApi.xml", true);
});
// JSON 输出保持原有大小写（不强制 camelCase）
builder.Services.AddControllers().AddJsonOptions(X => X.JsonSerializerOptions.PropertyNamingPolicy = null);
// 初始化雪花 Id 生成器
YitIdHelper.SetIdGenerator(new IdGeneratorOptions());
// 配置数据库上下文（MySQL 5.7.22 示例）
builder.Services.AddDbContext<Mycontext>(p =>
{
    p.UseMySql(builder.Configuration.GetConnectionString("db"), new MySqlServerVersion(new Version(5, 7, 22)), action =>
    {
        action.CommandTimeout(60); // 命令超时时间（秒）
        // SQL 自动重试策略：最大重试 5 次，间隔 5 秒
        action.EnableRetryOnFailure(maxRetryCount: 5, maxRetryDelay: TimeSpan.FromSeconds(5), errorNumbersToAdd: null);
    }).EnableSensitiveDataLogging();

    // 在控制台输出 SQL（仅用于开发/调试环境）
    p.UseLoggerFactory(LoggerFactory.Create(configure =>
    {
        configure
        .AddFilter((category, level) => category == DbLoggerCategory.Database.Command.Name && level == LogLevel.Information)
        .AddConsole();
    }));
});

//redis 添加redis 服务
builder.Services.AddSingleton<IConnectionMultiplexer>(p => ConnectionMultiplexer.Connect(builder.Configuration.GetConnectionString("Redis")));

// 注册 AutoMapper（显式指定配置类型）
builder.Services.AddAutoMapper(typeof(MappingProfile));
// 注册 MediatR（扫描当前程序集）
builder.Services.AddMediatR(R => R.RegisterServicesFromAssembly(Assembly.GetExecutingAssembly()));
// 注入通用仓储
builder.Services.AddScoped(typeof(IBaseRepository<>), typeof(BaseRepository<>));
// 全局异常过滤器
builder.Services.AddControllers(options =>
{
    options.Filters.Add<GlobalExceptionFilter>();
});
// 使用 NLog 作为日志记录
builder.Host.UseNLog();

var app = builder.Build();
// 允许任意来源跨域（根据需要在生产环境收紧）
app.UseCors(A => A.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin());

// 开发环境启用 Swagger UI
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseAuthorization();

app.MapControllers();

app.Run();
